package net.sf.rose.jdbc;

import java.util.HashMap;
import java.util.Map;

import net.sf.rose.jdbc.query.QuerySQL;

/**
 * 类说明：Action返回给前端的统一封装类
 * <p>
 * success表示操作是否成功
 * <p>
 * 如果不成功，message存储失败原因信息
 * <p>
 * data存储结果数据
 * <p>
 * dataExtend存储补充扩展结果数据
 * <p>
 * 其它存储分页信息
 * 
 * @author fengjian
 * @since 2018/07/14
 */
@SuppressWarnings("unchecked")
public class PageBean {

	/** 操作是否成功 */
	private boolean success = true;

	/** 操作提示消息 */
	private String message = null;

	/** * 消息代码 */
	private int code = 1;

	/** 页面跳转常量 */
	public static final String JUMP_PAGE_STEP_FIRST = "FIRS"; // 首页
	public static final String JUMP_PAGE_STEP_PREV = "PREV"; // 上一页
	public static final String JUMP_PAGE_STEP_CURR = "CURR"; // 当前页
	public static final String JUMP_PAGE_STEP_NEXT = "NEXT"; // 下一页
	public static final String JUMP_PAGE_STEP_LAST = "LAST"; // 未页

	/** 页面名称常量 */
	public static String PAGING_PAGE_SIZE = "pageSize"; // 总页数名称
	public static String PAGING_CURRENT_PAGE = "currentPage"; // 当前页名称

	/** 每页的记录数 */
	private int pageSize = 10;

	/** * 当前页 */
	private int pageIndex = 0;

	/** 记录总数 */
	private int total = 0;

	/** 总页数 */
	private int pageCount = 0;

	/** 返回给前端的记录数据 */
	private Object data = null;

	/** 返回给前端的记录数据扩展 */
	private Map<String, Object> dataMap = new HashMap<>();

	public PageBean() {
		super();
	}

	public PageBean(boolean success) {
		super();
		this.success = success;
	}

	public boolean isSuccess() {
		return success;
	}

	public void setSuccess(boolean success) {
		this.success = success;
	}

	/**
	 * 获取结果消息
	 * 
	 * @return 结果消息
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * 设置结果消息
	 * 
	 * @param message 结果消息
	 */
	public void setMessage(String message) {
		this.message = message;
	}

	/**
	 * 获取结果消息代码
	 * 
	 * @return 结果消息代码
	 */
	public int getCode() {
		return code;
	}

	/**
	 * 设置结果消息代码
	 * 
	 * @param code 结果消息代码
	 */
	public void setCode(int code) {
		this.code = code;
	}

	/**
	 * 功能：设置每页的记录数
	 * 
	 * @param pageSize - 每页的记录数
	 */
	public void setpageSize(int pageSize) {
		this.pageSize = pageSize < 1 ? this.pageSize : pageSize;
	}

	/**
	 * 功能：取得每页的记录数
	 * 
	 * @return 每页的记录数
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 功能：取得当前页码
	 * 
	 * @return 当前页码
	 */
	public int getPageIndex() {
		return pageIndex;
	}

	/**
	 * 功能：设置当前页
	 * 
	 * @param pageIndex - 当前页
	 */
	public void setPageIndex(int pageIndex) {
		this.pageIndex = pageIndex < 0 ? 0 : pageIndex;
	}

	/**
	 * 功能：加载返回给前端的记录数据
	 * 
	 * @param data 返回给前端的记录数据
	 */
	public void setData(Object data) {
		this.data = data;
	}

	/**
	 * 功能：取得返回给前端的记录数据
	 * 
	 * @param <T> 返回对象类型
	 * @return 返回给前端的记录数据
	 */
	public <T> T getData() {
		return (T) data;
	}

	/**
	 * 功能：取得返回给前端的记录数据扩展
	 * 
	 * @return 返回给前端的记录数据扩展
	 */
	public Map<String, Object> getDataMap() {
		return dataMap;
	}

	/**
	 * 功能：加载返回给前端的记录数据扩展
	 * 
	 * @param dataMap 返回给前端的记录数据扩展
	 */
	public void setDataMap(Map<String, Object> dataMap) {
		this.dataMap = dataMap;
	}

	/**
	 * 添加结果数据的记录数据扩展
	 * 
	 * @param key 键名
	 * @param val 键值
	 */
	public void addDataMap(String key, Object val) {
		this.dataMap.put(key, val);
	}

	/**
	 * 功能：取得记录总数
	 * 
	 * @return 记录总数
	 */
	public int getTotal() {
		return this.total;
	}

	/**
	 * 功能：设置记录总数
	 * 
	 * @param recordCount - 记录总数
	 */
	public void setTotal(int recordCount) {
		this.total = recordCount;
		pageCount = recordCount / pageSize;
		if (recordCount % pageSize != 0) {
			pageCount++;
		}
		// this.currentPage = 1;
	}

	/**
	 * 功能：取得总页数
	 * 
	 * @return 取得总页数
	 */
	public int getPageCount() {
		return this.pageCount;
	}

	/**
	 * 功能：是否有前一页
	 * 
	 * @return 是否有前一页
	 */
	public boolean isHasPreviousPage() {
		if (this.pageIndex > 0) {
			return true;
		}
		return false;
	}

	/**
	 * 功能：是否有下一页
	 * 
	 * @return 是否有下一页
	 */
	public boolean isHasNextPage() {
		if (this.pageIndex < this.pageCount) {
			return true;
		}
		return false;
	}

	/**
	 * 功能：转到指定页
	 * 
	 * @param page - 指定的页码
	 */
	public void gotoPage(String page) {
		if (page == null) {
			pageIndex = 0;
		} else if (page.equals(JUMP_PAGE_STEP_FIRST)) {
			pageIndex = 0;
		} else if (page.equals(JUMP_PAGE_STEP_PREV)) {
			pageIndex--;
		} else if (page.equals(JUMP_PAGE_STEP_NEXT)) {
			pageIndex++;
		} else if (page.equals(JUMP_PAGE_STEP_LAST)) {
			pageIndex = pageCount;
		} else {
			pageIndex = 0;
		}
	}

	/**
	 * 功能：转到指定页
	 * 
	 * @param page - 指定的页码
	 */
	public void gotoPage(int page) {
		if (page < 0) {
			pageIndex = 0;
		}
		if (page > pageCount) {
			pageIndex = pageCount;
		}
		pageIndex = page;
	}

	/**
	 * 功能：设置Oracle的分页参数
	 * 
	 * @param query - Oracle的分页参数
	 */
	public void setOraclePageSQL(QuerySQL query) {
		String sql = query.getSql();
		sql = "select T.*, rownum as PAGE_ROW_COUNT, MAX(ROWNUM) OVER() AS ALL_ROW_COUNT from (" + sql + ") T";
		sql = "select * from (" + sql + ") T where PAGE_ROW_COUNT >?  and PAGE_ROW_COUNT <= ?";
		query.updateSQL(sql);
		pageIndex = pageIndex < 0 ? 0 : pageIndex;
		int index = pageIndex * pageSize;
		query.addParameter(index);
		query.addParameter(index + pageSize);
	}

	/**
	 * 生成成功消息
	 * 
	 * @param message - 成功消息
	 * @return - 返回成功消息
	 */
	public static PageBean success(String message) {
		PageBean page = new PageBean();
		page.setMessage(message);
		return page;
	}

	/**
	 * @return - 返回保存成功消息
	 */
	public static PageBean saveSuccess() {
		return success("保存成功");
	}

	/**
	 * @return - 返回更新成功消息
	 */
	public static PageBean updateSuccess() {
		return success("更新成功");
	}

	/**
	 * @return - 返回删除成功消息
	 */
	public static PageBean deleteSuccess() {
		return success("删除成功");
	}

	/**
	 * 生成失败消息
	 * 
	 * @param message - 失败消息
	 * @return
	 */
	public static PageBean faild(String message) {
		PageBean page = new PageBean();
		page.setSuccess(false);
		page.setMessage(message);
		return page;
	}

	/**
	 * @return - 返回保存失败消息
	 */
	public static PageBean saveFaild() {
		return success("保存失败");
	}

	/**
	 * @return - 返回更新失败消息
	 */
	public static PageBean updateFaild() {
		return success("更新失败");
	}

	/**
	 * @return - 返回删除失败消息
	 */
	public static PageBean deleteFaild() {
		return success("删除失败");
	}
}
